import os
from datetime import datetime
import random

import pandas as pd

# 读取Excel文件，文件里的值最好都设置成文本
file_path = 'D:\\IOT3.0\\2024.09\\实体赋码平台\\标准分类&属性&模型导入模板.xlsx'  # 替换为你的文件路径
df = pd.read_excel(file_path, engine='openpyxl',sheet_name='分类管理', skiprows=1)


# 获取文件名和扩展名
file_name, _ = os.path.splitext(os.path.basename(file_path))
# 假设你的列名为：node_code, node_name, parent_id, node_level
# 并且按顺序处理，以下是处理过程

# 输出表格头
output_headers = ['category_id','node_code', 'node_name', 'parent_id', 'node_level','remark','order_no','create_by','update_by','tenant_id']
output_df = pd.DataFrame(columns=output_headers)

def generate_random_code(length=10):
    # 固定前缀
    prefix = '18'
    # 生成指定长度的随机数字字符串
    return str(prefix +''.join([str(random.randint(0, 9)) for _ in range(length)]))

# print(df.columns)
# 去重A列对应的去重B列
unique_a_b = df[['门类名称', '门类编码']].drop_duplicates().dropna(subset=['门类名称', '门类编码'])
print("1级去重后的个数:", len(unique_a_b))

# 创建一个字典来保存门类名称与 category_id 的对应关系
category_mapping1 = {}
category_mapping2 = {}
category_mapping3 = {}
category_mapping4 = {}
category_mapping5 = {}

# output_df = pd.DataFrame()

# 格式化为所需格式
formatted_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')

for index, row in unique_a_b.iterrows():
    category_id1 = generate_random_code() # 生成随机的 category_id
    output_df = output_df.append({
        'category_id':category_id1,
        'node_code': str(int(row['门类编码'])).zfill(2),
        'node_name': row['门类名称'],
        'parent_id': '',
        'node_level': '1',
        'remark':'',
        'order_no':'',
        # 'create_time':formatted_time,
        'create_by':'admin',
        # 'update_time':'',
        'update_by':'',
        'tenant_id':'defaultTenantId'
    }, ignore_index=True)

    # 记录门类名称与 category_id 的对应关系
    category_mapping1[row['门类名称']] = category_id1

# print(category_mapping1)

# 表格C列对应的D列值
unique_c_d = df[['门类名称','大类名称', '大类编码']].drop_duplicates().dropna(subset=['大类名称', '大类编码'])
print("2级去重后的个数:", len(unique_c_d))
for index, row in unique_c_d.iterrows():
    category_id2 = generate_random_code()  # 生成随机的 category_id
    output_df = output_df.append({
        'category_id':category_id2,
        'node_code': str(int(row['大类编码'])).zfill(2),
        'node_name': row['大类名称'],
        'parent_id': category_mapping1[row['门类名称']],
        'node_level': '2',
        'remark':'',
        'order_no':'',
        # 'create_time':formatted_time,
        'create_by':'admin',
        # 'update_time':'',
        'update_by':'',
        'tenant_id':'defaultTenantId'
    }, ignore_index=True)

    # 记录大类名称与 category_id 的对应关系
    category_mapping2[row['大类名称']] = category_id2

# 表格E列对应的F列值
unique_e_f = df[['大类名称','中类名称', '中类编码']].drop_duplicates().dropna(subset=['中类名称', '中类编码'])
# print("去重后的细类:", unique_e_f)
print("3级去重后的个数:", len(unique_e_f))
for index, row in unique_e_f.iterrows():
    category_id3 = generate_random_code()  # 生成随机的 category_id
    output_df = output_df.append({
        'category_id':category_id3,
        'node_code': str(int(row['中类编码'])).zfill(2),
        'node_name': row['中类名称'],
        'parent_id': category_mapping2[row['大类名称']],
        'node_level': '3',
        'remark':'',
        'order_no':'',
        # 'create_time':formatted_time,
        'create_by':'admin',
        # 'update_time':'',
        'update_by':'',
        'tenant_id':'defaultTenantId'
    }, ignore_index=True)

    # 记录中类名称与 category_id 的对应关系
    category_mapping3[row['中类名称']] = category_id3

# 表格G列对应的H列值
unique_g_h = df[['中类名称','小类名称', '小类编码']].drop_duplicates().dropna(subset=['小类名称', '小类编码'])
print("4级去重后的个数:", len(unique_g_h))
for index, row in unique_g_h.iterrows():
    category_id4 = generate_random_code()  # 生成随机的 category_id
    output_df = output_df.append({
        'category_id':category_id4,
        'node_code': str(int(row['小类编码'])).zfill(2),
        'node_name': row['小类名称'],
        'parent_id': category_mapping3[row['中类名称']],
        'node_level': '4',
        'remark':'',
        'order_no':'',
        # 'create_time':formatted_time,
        'create_by':'admin',
        # 'update_time':'',
        'update_by':'',
        'tenant_id':'defaultTenantId'
    }, ignore_index=True)

    # 记录小类名称与 category_id 的对应关系
    category_mapping4[row['小类名称']] = category_id4

# 表格I列对应的J列值
# original_count = df.shape[0]  # 原始行数
unique_i_j = df[['小类名称','细类名称', '细类编码']].drop_duplicates().dropna(subset=['细类名称', '细类编码'])
# filtered_count = unique_i_j.shape[0]  # 去重和去空后的行数
# # 找到被去掉的行
# dropped_rows = df[~df.index.isin(unique_i_j.index)]
#
# # 打印被去掉的行
# if not dropped_rows.empty:
#     print("被去掉的行:")
#     print(dropped_rows)
# else:
#     print("没有被去掉的行。")

# print("去重后的细类:", unique_i_j)
# 打印去重后的个数
print("5级去重后的个数:", len(unique_i_j))

for index, row in unique_i_j.iterrows():
    if not pd.isna(row['细类编码']) and not pd.isna(row['细类名称']):
        category_id5 = generate_random_code()  # 生成随机的 category_id
        output_df = output_df.append({
            'category_id':category_id5,
            'node_code': str(int(row['细类编码'])).zfill(2),
            'node_name': row['细类名称'],
            'parent_id': category_mapping4[row['小类名称']],
            'node_level': '5',
            'remark':'',
            'order_no':'',
            # 'create_time':formatted_time,
            'create_by':'admin',
            # 'update_time':'',
            'update_by':'',
            'tenant_id':'defaultTenantId'
        }, ignore_index=True)
    else:
        print(f"第 {index} 行数据无效: {row}")

    # 记录小类名称与 category_id 的对应关系
    category_mapping5[row['细类名称']] = category_id5


# 检查 node_name 是否有重复的数据
duplicate_node_names = output_df[output_df.duplicated(subset=['node_name'], keep=False)]

if not duplicate_node_names.empty:
    print("发现重复的 node_name:")
    print(duplicate_node_names)
else:
    print("没有重复的 node_name。")

# 在导出之前，将 'category_id' 列转换为字符串类型（如果尚未转换）
# output_df['category_id'] = output_df['category_id'].astype(str)

# 保存到新的Excel文件/csv
output_file_path = f'{file_name}.xlsx'  # 替换为你的输出文件路径,导出一份excel保险，因为category_id有可能会变成科学计法，不至于数据丢失
output_df.to_excel(output_file_path, index=False, encoding='utf-8')

# output_file_path = f'{file_name}.csv'  # 替换为你的输出文件路径
# output_df.to_csv(output_file_path, index=False, encoding='utf-8', quoting=1)

print("entity_category处理完成，结果已保存到", output_file_path)


combined_mapping = {}
for mapping in [category_mapping1, category_mapping2, category_mapping3, category_mapping4, category_mapping5]:
    combined_mapping.update(mapping)

# 添加后缀
combined_mapping = {f"{k}_分类_模型": v for k, v in combined_mapping.items()}
# print(combined_mapping)

# 输出表格头
output_headers = ['model_vid','category_id', 'model_name', 'version', 'model_json','status','create_by','update_by','del_flag','tenant_id']
output_df = pd.DataFrame(columns=output_headers)

for key,value in combined_mapping.items():
    model_vid = generate_random_code()  # 生成随机的 model_vid
    output_df = output_df.append({
    'model_vid':model_vid,
    'category_id': value,
    'model_name': key,
    'version': 1,
    'model_json': '',
    'status':1,
    'create_by':'admin',
    # 'update_time':'',
    'update_by':'',
    'del_flag':1,
    'tenant_id':'defaultTenantId'
}, ignore_index=True)

# 保存到新的Excel文件/csv
output_file_path = 'entity_model_version.xlsx'  # 替换为你的输出文件路径,导出一份excel保险，因为category_id有可能会变成科学计法，不至于数据丢失
output_df.to_excel(output_file_path, index=False, encoding='utf-8')

# output_file_path1 = 'entity_model_version.csv'  # 替换为你的输出文件路径
# output_df.to_csv(output_file_path1, index=False, encoding='utf-8')

print("entity_model_version处理完成，结果已保存到", output_file_path)